#ifndef RUN_CMD_BASE_H
#define RUN_CMD_BASE_H

#include <sys/types.h>
#include <stddef.h>

class RunCmdBase
{
    RunCmdBase(RunCmdBase &);
    RunCmdBase &operator=(RunCmdBase &);
public:
    /* 传入命令的名字，不许附带参数; 是否需要获得执行命令的返回结果 */
    RunCmdBase(const char *cmd);
    ~RunCmdBase();

    //! 重新设置程序的名字
    void setProgramName(const char *cmd);

    /* 添加命令参数 */
    inline void appendArgue(const char *arg)
    {
        appendStrings(arg, NULL);
    }
    inline void appendArgue(const char *arg, const char *arg1)
    {
        appendStrings(arg, arg1, NULL);
    }
    inline void appendArgue(const char *arg, const char *arg1, const char *arg2)
    {
        appendStrings(arg, arg1, arg2, NULL);
    }
    inline void appendArgue(const char *arg, const char *arg1, const char *arg2, const char *arg3)
    {
        appendStrings(arg, arg1, arg2, arg3, NULL);
    }
    inline void appendArgue(const char *arg, const char *arg1, const char *arg2, const char *arg3, const char *arg4)
    {
        appendStrings(arg, arg1, arg2, arg3, arg4, NULL);
    }
    inline void appendArgue(const char *arg, const char *arg1, const char *arg2, const char *arg3, const char *arg4, const char *arg5)
    {
        appendStrings(arg, arg1, arg2, arg3, arg4, arg5, NULL);
    }
    inline void appendArgue(const char *arg, const char *arg1, const char *arg2, const char *arg3, const char *arg4, const char *arg5, const char *arg6)
    {
        appendStrings(arg, arg1, arg2, arg3, arg4, arg5, arg6, NULL);
    }

    /* 清空命令参数 */
    inline void clear()
    {
        argv[1] = 0;
        nNum    = 1;
    }

    /**
     * @brief appendStrings
     * @param arg [in] 命令参数
     * @warning 程序不负责管理，字符串参数内存，所以 传递的参数必须是字符常量或者是在堆区分配内存的字符串
     *  还有一种的这个类定义的变量本省就是局部变量，那 么其传值，可以时局部变量(但也要注意使用).
     *  最后的结束空指针必须传NULL，传0，在64系统时会出现问题
     */
    void  appendStrings(const char *arg, ...);

    static int   wait4pid(pid_t pid);
    static pid_t safe_waitpid(pid_t pid, int *wstat, int options);

    //! debug list
    void profile();
protected:

    int    nAlloc;
    int    nNum;
    char** argv;
};

#endif // RUN_CMD_BASE_H
